package Tier2;

import java.util.Properties;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;

import Shared._Config;

/**
 * Implémente le protocole Corba.
 * Lance le service PartyManager, spécifié dans Tier2/ORB_PartyManager/PartyManager.java (généré grâce à l'idl), 
 * implémenté par Tier2/PartyManagerImpl.java (avec proxy IIOP)
 * 
 */
public class ServeurIIOP {
    
    //+----------------------------------------------------------------------+
    //| (sous Linux)
    //| Pour générer les classes ORB à partir du module <ORB_PartyManager.idl> dans le package Tier2
    //|     cd <workspace>/SIL6\ -\ Bataille/src/Tier2/ORB_PartyManager
    //|     ./compile.sh orb
    //|
    //| Pour démarrer ORB, en localhost sur le port 2000
    //|     orbd -ORBInitialPort 2000 -ORBInitialHost 127.0.0.1 -J-showversion &
    //|
    //| Pour compiler les classes et lancer via le shell un Serveur IIOP et un client IIOP
    //|     cd <workspace>/SIL6\ -\ Bataille/src/Tier2/ORB_PartyManager
    //|     ./compile.sh class
    //|     ./compile.sh serveur  #lance la classe serveur : en cas d'erreur s'assurer qu'ORB est demarré (ci-dessus)
    //|     ./compile.sh client
    //|
    //| Pour arrêter ORB
    //|    killall orbd #probablement pas la meilleure façon
    //|
    //+----------------------------------------------------------------------+    
    public static void main(String[] args) throws Exception {

	// Création de la couche ORB

	Properties props = new Properties();
	props.put("org.omg.CORBA.ORBInitialPort", _Config.ORB_port);
	props.put("org.omg.CORBA.ORBInitialHost", _Config.ORB_host);
	ORB orb = ORB.init((String[]) null, props);	
	
	// Recherche du stub serveur + service de nommage (annuaire d'objet)
	POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
	rootPOA.the_POAManager().activate();
	
	org.omg.CORBA.Object ref_annuaire = orb.resolve_initial_references(_Config.ORB_services);
	NamingContextExt annuaire = NamingContextExtHelper.narrow(ref_annuaire);

	// Création du service <Party Manager> et de son enveloppe CORBA (POA)
	// + Enregistrement auprès du service de nommage

	PartyManagerImpl.IIOP managerImpl = new PartyManagerImpl().new IIOP();
	Tier2.ORB_PartyManager.PartyManager manager = Tier2.ORB_PartyManager.PartyManagerHelper.narrow(rootPOA.servant_to_reference(managerImpl));

	NameComponent[] path = annuaire.to_name(_Config.party_manager);
	annuaire.rebind(path, manager);

	// Démarrage de la couche ORB
	System.out.println("Service enregistre");
	orb.run();
    }
}
